package org.jeecg.modules.yinsheng.utils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * <P>Json格式解析工具类</P>
 * 
 * @version 1.0
 * @author 黄雄星（13077862552） 2013-10-11 下午1:38:24
 */
public class JsonParser {

	private static String classStr = "class";

	private JsonParser() {
	}

	/**
	 * 
	 * <p>转换json字符串为java object</p>
	 * 
	 * @param jsonDetailsResult
	 * @param cls
	 * @return
	 * @author 黄雄星（13077862552） 2013-10-11 下午1:39:42
	 */
	public static <T> T parse(final String jsonDetailsResult, final Class<T> cls) {
		return JSON.toJavaObject(JSON.parseObject(jsonDetailsResult), cls);
	}

	public static <T> T parserJsonStringToJavaObject(final String jsonDetailsResult, final Class<T> cls) {
		return JSON.toJavaObject(JSON.parseObject(jsonDetailsResult, Feature.InternFieldNames), cls);
	}

	/**
	 * 
	 * <p>转换json字符串为java object(新)</p>
	 * 
	 * @param jsonDetailsResult
	 * @param cls
	 * @return
	 * @author 黄雄星（13077862552） 2013-10-11 下午1:39:42
	 */
	public static <T> List<T> parserJsonStringToJavaArrayNew(final String jsonDetailsResult, final Class<T> cls) {
		final List<T> javaOjbects = new ArrayList<T>();
		final JSONArray array = JSON.parseArray(jsonDetailsResult);
		for (int i = 0; i < array.size(); i++) {
			javaOjbects.add(JSON.toJavaObject(JSON.parseObject(array.getString(i)), cls));
		}
		return javaOjbects;
	}

	/**
	 * 
	 * <p>转换json字符串为java object(旧)</p>
	 * 
	 * @param jsonDetailsResult
	 * @param cls
	 * @return
	 * @author 黄雄星（13077862552） 2013-10-11 下午1:39:42
	 */
	public static <T> List<T> parserJsonStringToJavaArray(final String jsonDetailsResult, final Class<T> cls) {
		final List<T> javaOjbects = new ArrayList<T>();
		final JSONArray array = JSON.parseArray(jsonDetailsResult);
		for (int i = 0; i < array.size(); i++) {
			javaOjbects.add(JSON.toJavaObject(JSON.parseArray(jsonDetailsResult).getJSONObject(i), cls));
		}
		return javaOjbects;
	}

	/**
	 * 
	 * <p>转换java object为json 字符串</p>
	 * 
	 * @param jsonDetailsResult
	 * @param cls
	 * @return
	 * @author 黄雄星（13077862552） 2013-10-11 下午1:39:42
	 */
	public static <T> String toJson(final T javaObject) {
		return JSON.toJSONString(javaObject);
	}

	/**
	 * 
	 * <p>TODO</p>
	 * 
	 * @param javaObject
	 * @return
	 * @author 黄雄星（13077862552） 2014-7-9 下午1:38:36
	 */
	public static <T> String parserJavaObjectToJsonString(final T javaObject, boolean isNullToEmpty) {
		return object2String(javaObject, isNullToEmpty, false);
	}

	/**
	 * 
	 * <p>Object 2 String</p>
	 * 
	 * @param javaObject
	 * @param isNullToEmpty
	 * @param isReplace \ 替换成 空字符串
	 * @return
	 * @author 黄雄星（13077862552） 2016-5-7 下午3:41:32
	 */
	public static <T> String object2String(final T javaObject, boolean isNullToEmpty, boolean isReplace) {
		String result = "";
		if (isNullToEmpty) {
			result = JSON.toJSONString(javaObject, SerializerFeature.WriteMapNullValue,
					SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullNumberAsZero);
		} else {
			result = JSON.toJSONString(javaObject);
		}

		// 替换字符串中的"\"
		if (isReplace) {
			result.replace("\\", "");
		}
		return result;

	}

	/**
	 * <p>json字符串转map</p>
	 * 
	 * @param jsonDetailsResult json字符串
	 * @return
	 * @throws Exception
	 * @author 林仙龙 2017-3-3 下午12:26:23
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, String> toMap(final String jsonDetailsResult) {
		return JSONObject.parseObject(jsonDetailsResult, Map.class);
	}

	/**
	 * 
	 * <p>object to map</p>
	 * 
	 * @param o
	 * @param isIgnoreBlankOrNull :忽略null及空字符串 转换成map
	 * @return
	 * @author 黄雄星（13077862552） 2014-5-20 上午10:16:50
	 */
	public static Map<String, String> ObjectToMap(final Object o) {
		boolean isIgnoreBlankOrNull = true;
		try {
			Map<String, String> map = new HashMap<String, String>();
			BeanInfo beanInfo = Introspector.getBeanInfo(o.getClass());
			for (PropertyDescriptor descriptor : beanInfo.getPropertyDescriptors()) {
				String name = descriptor.getName();
				if (classStr.equals(name))
					continue;
				Object obj = descriptor.getReadMethod().invoke(o);
				if (isIgnoreBlankOrNull
						&& (obj == null || (obj instanceof String && StringUtils.isBlank((String) obj)))) {

				} else {
					map.put(name, obj.toString());
				}
			}
			return map;
		} catch (Exception e) {
		}
		return null;
	}

	public static void main(String[] args) {
	}
}
